/* Producción - Reservar y comprar */

package edu.client;

import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.datepicker.client.DateBox;

import edu.client.ProduccionService.ProduccionService;
import edu.client.ProduccionService.ProduccionServiceAsync;
import edu.shared.DTO.OrdenFabricacionGeneralDTO;
import edu.shared.DTO.RequerimientoCompraDTO;
import edu.shared.DTO.RequerimientoMaterialDTO;
import edu.shared.DTO.ReservaProductoDTO;

public class P_ReservarYComprar extends Composite {
	
	private String tituloTab;
	TabPanel padre;
	
	FlexTable requerimientoMaterialesFT;
	FlexTable comprasFT;
	FlexTable reservasFT;
	
	LinkedList<TextBox> cantidadReservadaLL;
	boolean errorReserva;
	int reservaSeleccionada;
	
	//columnas de la tabla requerimiento de materiales
	private static final int RM_EXPANDIR = 0;
	private static final int RM_CHECK = 1;
	private static final int RM_ELEMENTO = 2;
	private static final int RM_MATERIAL = 3;
	private static final int RM_MEDIDA_FIJA = 4;
	private static final int RM_MEDIDA_VARIABLE_1 = 5;
	private static final int RM_MEDIDA_VARIABLE_2 = 6;
	private static final int RM_CANTIDAD = 7;
	private static final int RM_REQUERIMIENTO_BRUTO = 8;
	private static final int RM_REQUERIMIENTO_NETO = 9;
	private static final int RM_FECHA_PREVISTA_INICIO = 10;
	
	// columnas de la tabla reservas
	private static final int RES_MEDIDA_VARIABLE_1 = 0;
	private static final int RES_MEDIDA_VARIABLE_2 = 1;
	private static final int RES_CANTIDAD_PENDIENTE_ENTREGA = 2;
	private static final int RES_CANTIDAD_DISPONIBLE = 3;
	private static final int RES_CANTIDAD_RESERVADA = 4;
	
	// columnas de la tabla compras
	private static final int COM_MEDIDA_VARIABLE_1 = 0;
	private static final int COM_MEDIDA_VARIABLE_2 = 1;
	private static final int COM_CANTIDAD_SOLICITADA = 2;
	private static final int COM_FECHA_REQUERIMIENTO_COMPRA = 3;
	
	TextBox fechaPrevistaInicioTB;
	TextBox elementoTB;
	TextBox materialTB;
	TextBox medidaFijaTB;
	
	TextBox totalReservadoTB;
	TextBox totalSolicitadoTB;
	TextBox totalProvistoTB;
	TextBox totalRCPTB;
	TextBox totalRequeridoTB;
	
	Button confirmarCambiosBtn;
	Button descartarCambiosBtn;
	
	DateTimeFormat formatoFecha = DateTimeFormat.getFormat("dd/MM/yyyy");
	
	private ProduccionServiceAsync produccionService;
	
	int filaAIngresar;
	int requerimientoSeleccionadoLista;
	List<RequerimientoMaterialDTO> listaRequerimientoMaterialesDTO;
	
	OrdenFabricacionGeneralDTO ordenFabricacion;
	
	public P_ReservarYComprar (TabPanel padre, String tituloTab, OrdenFabricacionGeneralDTO ordenFabricacion) {
		
		this.tituloTab = tituloTab;
		this.padre = padre;
		produccionService = GWT.create(ProduccionService.class);
		
		this.ordenFabricacion = ordenFabricacion;
		cantidadReservadaLL = new LinkedList<TextBox>();
		errorReserva = false;
		reservaSeleccionada = 0;
		
		LayoutPanel layoutPanel = new LayoutPanel();
		initWidget(layoutPanel);
		layoutPanel.setSize((Window.getClientWidth() - 55) + "px", "1040px");
		
		///////// SECCIÓN REQUERMIENTO DE MATERIALES
		
		Label requerimientoMaterialesLabel = new Label("REQUERIMIENTO DE MATERIALES");
		requerimientoMaterialesLabel.setStyleName("labelTitulo");
		layoutPanel.add(requerimientoMaterialesLabel);
		layoutPanel.setWidgetLeftWidth(requerimientoMaterialesLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(requerimientoMaterialesLabel, 15.0, Unit.PX, 50.0, Unit.PX);
		
		Label nroOrdenFabricacionLabel = new Label("Nº ORDEN DE FABRICACIÓN:");
		nroOrdenFabricacionLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		nroOrdenFabricacionLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(nroOrdenFabricacionLabel);
		layoutPanel.setWidgetLeftWidth(nroOrdenFabricacionLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(nroOrdenFabricacionLabel, 77.0, Unit.PX, 19.0, Unit.PX);
		
		TextBox nroOrdenFabricacionTB = new TextBox();
		layoutPanel.add(nroOrdenFabricacionTB);
		layoutPanel.setWidgetLeftWidth(nroOrdenFabricacionTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(nroOrdenFabricacionTB, 72.0, Unit.PX, 32.0, Unit.PX);
		nroOrdenFabricacionTB.setText(String.valueOf(ordenFabricacion.getNroOrden()));
		nroOrdenFabricacionTB.setEnabled(false);
		
		Label fechaFinalizacionLabel = new Label("FECHA FINALIZACIÓN:");
		fechaFinalizacionLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		fechaFinalizacionLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(fechaFinalizacionLabel);
		layoutPanel.setWidgetLeftWidth(fechaFinalizacionLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(fechaFinalizacionLabel, 77.0, Unit.PX, 19.0, Unit.PX);
		
		TextBox fechaFinalizacionTB = new TextBox();
		layoutPanel.add(fechaFinalizacionTB);
		layoutPanel.setWidgetLeftWidth(fechaFinalizacionTB, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(fechaFinalizacionTB, 72.0, Unit.PX, 32.0, Unit.PX);
		fechaFinalizacionTB.setText(formatoFecha.format(ordenFabricacion.getFechaPrevistaFinalizacion()));
		fechaFinalizacionTB.setEnabled(false);
		
		ScrollPanel requerimientoMaterialesSP = new ScrollPanel();
		requerimientoMaterialesSP.setStyleName("tabla");
		layoutPanel.add(requerimientoMaterialesSP);
		layoutPanel.setWidgetLeftWidth(requerimientoMaterialesSP, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(requerimientoMaterialesSP, 124.0, Unit.PX, 250.0, Unit.PX);
		
		requerimientoMaterialesFT = new FlexTable();
		requerimientoMaterialesSP.setWidget(requerimientoMaterialesFT);
		requerimientoMaterialesFT.setSize("100%", "100%");
		
		//cargamos el encabezado de la tabla	
		
		// columna expandir
		requerimientoMaterialesFT.setText(0, RM_EXPANDIR, "");
		requerimientoMaterialesFT.getCellFormatter().setWidth(0, RM_EXPANDIR, "5%");
		
		// columna check
		requerimientoMaterialesFT.setText(0, RM_CHECK, "");
		requerimientoMaterialesFT.getCellFormatter().setWidth(0, RM_CHECK, "5%");
		
		// columna elemento
		requerimientoMaterialesFT.setText(0, RM_ELEMENTO, "ELEMENTO");
		requerimientoMaterialesFT.getCellFormatter().setWidth(0, RM_ELEMENTO, "15%");
		
		// columna material
		requerimientoMaterialesFT.setText(0, RM_MATERIAL, "MATERIAL");
		requerimientoMaterialesFT.getCellFormatter().setWidth(0, RM_MATERIAL, "15%");
		
		// columna medida fija
		requerimientoMaterialesFT.setText(0, RM_MEDIDA_FIJA, "MEDIDA FIJA");
		requerimientoMaterialesFT.getCellFormatter().setWidth(0, RM_MEDIDA_FIJA, "6.66%");
		
		// columna medida variable 1
		requerimientoMaterialesFT.setText(0, RM_MEDIDA_VARIABLE_1, "MEDIDA VARIABLE 1");
		requerimientoMaterialesFT.getCellFormatter().setWidth(0, RM_MEDIDA_VARIABLE_1, "6.66%");
				
		// columna medida variable 2
		requerimientoMaterialesFT.setText(0, RM_MEDIDA_VARIABLE_2, "MEDIDA VARIABLE 2");
		requerimientoMaterialesFT.getCellFormatter().setWidth(0, RM_MEDIDA_VARIABLE_2, "6.66%");
				
		// columna cantidad
		requerimientoMaterialesFT.setText(0, RM_CANTIDAD, "CANTIDAD REQUERIDA");
		requerimientoMaterialesFT.getCellFormatter().setWidth(0, RM_CANTIDAD, "5%");
				
		// columna requerimiento bruto
		requerimientoMaterialesFT.setText(0, RM_REQUERIMIENTO_BRUTO, "REQUERIMIENTO BRUTO");
		requerimientoMaterialesFT.getCellFormatter().setWidth(0, RM_REQUERIMIENTO_BRUTO, "5%");
				
		// columna requerimiento neto
		requerimientoMaterialesFT.setText(0, RM_REQUERIMIENTO_NETO, "REQUERIMIENTO NETO");
		requerimientoMaterialesFT.getCellFormatter().setWidth(0, RM_REQUERIMIENTO_NETO, "5%");
				
		// columna fecha estimada inicio
		requerimientoMaterialesFT.setText(0, RM_FECHA_PREVISTA_INICIO, "FECHA PREVISTA INICIO");
		requerimientoMaterialesFT.getCellFormatter().setWidth(0, RM_FECHA_PREVISTA_INICIO, "10%");
				
		
		// seteamos el estilo a los encabezados
		requerimientoMaterialesFT.getRowFormatter().addStyleName(0, "tablaEncabezado");
		
		/////////////////////// SECCIÓN REQUERIMIENTOS Y RESERVAS DE PRODUCTO
		
		Label requerimientosYReservasLabel = new Label("SOLICITUDES DE COMPRA Y RESERVAS DE PRODUCTOS");
		requerimientosYReservasLabel.setStyleName("labelTitulo");
		layoutPanel.add(requerimientosYReservasLabel);
		layoutPanel.setWidgetLeftWidth(requerimientosYReservasLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(requerimientosYReservasLabel, 380.0, Unit.PX, 50.0, Unit.PX);
		
		Label elementoLabel = new Label("ELEMENTO: ");
		elementoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		elementoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(elementoLabel);
		layoutPanel.setWidgetLeftWidth(elementoLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(elementoLabel, 440.0, Unit.PX, 19.0, Unit.PX);
		
		elementoTB = new TextBox();
		layoutPanel.add(elementoTB);
		layoutPanel.setWidgetLeftWidth(elementoTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(elementoTB, 435.0, Unit.PX, 32.0, Unit.PX);
		elementoTB.setEnabled(false);
		
		Label materialLabel = new Label("MATERIAL: ");
		materialLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		materialLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(materialLabel);
		layoutPanel.setWidgetLeftWidth(materialLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(materialLabel, 440.0, Unit.PX, 19.0, Unit.PX);
		
		materialTB = new TextBox();
		layoutPanel.add(materialTB);
		layoutPanel.setWidgetLeftWidth(materialTB, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(materialTB, 435.0, Unit.PX, 32.0, Unit.PX);
		materialTB.setEnabled(false);
		
		Label medidaFijaLabel = new Label("MEDIDA FIJA:");
		medidaFijaLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		medidaFijaLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(medidaFijaLabel);
		layoutPanel.setWidgetLeftWidth(medidaFijaLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(medidaFijaLabel, 485.0, Unit.PX, 19.0, Unit.PX);
		
		medidaFijaTB = new TextBox();
		layoutPanel.add(medidaFijaTB);
		layoutPanel.setWidgetLeftWidth(medidaFijaTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(medidaFijaTB, 480.0, Unit.PX, 32.0, Unit.PX);
		medidaFijaTB.setEnabled(false);
		
		Label fechaPrevistaInicioLabel = new Label("FECHA PREVISTA INICIO:");
		fechaPrevistaInicioLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		fechaPrevistaInicioLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(fechaPrevistaInicioLabel);
		layoutPanel.setWidgetLeftWidth(fechaPrevistaInicioLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(fechaPrevistaInicioLabel, 485.0, Unit.PX, 19.0, Unit.PX);
		
		fechaPrevistaInicioTB = new TextBox();
		layoutPanel.add(fechaPrevistaInicioTB);
		layoutPanel.setWidgetLeftWidth(fechaPrevistaInicioTB, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(fechaPrevistaInicioTB, 480.0, Unit.PX, 32.0, Unit.PX);
		fechaPrevistaInicioTB.setEnabled(false);
		
		Label reservasLabel = new Label("RESERVAS");
		reservasLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(reservasLabel);
		layoutPanel.setWidgetLeftWidth(reservasLabel, 5.0, Unit.PCT, 217.0, Unit.PX);
		layoutPanel.setWidgetTopHeight(reservasLabel, 554.0, Unit.PX, 19.0, Unit.PX);
		
		AbsolutePanel reservasAP = new AbsolutePanel();
		reservasAP.setStyleName("panelConBorde");
		layoutPanel.add(reservasAP);
		layoutPanel.setWidgetLeftWidth(reservasAP, 5.0, Unit.PCT, 35.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(reservasAP, 579.0, Unit.PX, 310.0, Unit.PX);
		
		ScrollPanel reservasSP = new ScrollPanel();
		reservasSP.setStyleName("tabla");
		reservasAP.add(reservasSP, -10, -5);
		reservasSP.setSize("415px", "250px");
		
		reservasFT = new FlexTable();
		reservasSP.setWidget(reservasFT);
		reservasFT.setSize("100%", "100%");
		
	    //cargamos el encabezado de la tabla	
		
		// columna medida variable 1
		reservasFT.setText(0, RES_MEDIDA_VARIABLE_1, "MEDIDA VARIABLE 1");
		reservasFT.getCellFormatter().setWidth(0, RES_MEDIDA_VARIABLE_1, "20%");
		
		// columna medida variable 2
		reservasFT.setText(0, RES_MEDIDA_VARIABLE_2, "MEDIDA VARIABLE 2");
		reservasFT.getCellFormatter().setWidth(0, RES_MEDIDA_VARIABLE_2, "20%");
		
		// columna estado producto
		reservasFT.setText(0, RES_CANTIDAD_PENDIENTE_ENTREGA, "CANTIDAD RESERVADA PENDIENTE DE ENTREGA");
		reservasFT.getCellFormatter().setWidth(0, RES_CANTIDAD_PENDIENTE_ENTREGA, "20%");
		
		// columna cantidad disponible
		reservasFT.setText(0, RES_CANTIDAD_DISPONIBLE, "CANTIDAD DISPONIBLE");
		reservasFT.getCellFormatter().setWidth(0, RES_CANTIDAD_DISPONIBLE, "20%");
		
		// columna cantidad reservada
		reservasFT.setText(0, RES_CANTIDAD_RESERVADA, "CANTIDAD RESERVADA");
		reservasFT.getCellFormatter().setWidth(0, RES_CANTIDAD_RESERVADA, "20%");
		
		// seteamos el estilo a los encabezados
		reservasFT.getRowFormatter().addStyleName(0, "tablaEncabezado");
		
		Label totalReservadoLabel = new Label("TOTAL RESERVADO: ");
		totalReservadoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		totalReservadoLabel.setStyleName("gwt-LabelFormulario");
		reservasAP.add(totalReservadoLabel, 200, 275);
		totalReservadoLabel.setSize("123px", "19px");
		
		totalReservadoTB = new TextBox();
		reservasAP.add(totalReservadoTB, 335, 270);
		totalReservadoTB.setSize("80px", "28");
		totalReservadoTB.setEnabled(false);
		
		Label comprasLabel = new Label("SOLICITUD DE COMPRAS");
		comprasLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(comprasLabel);
		layoutPanel.setWidgetLeftWidth(comprasLabel, 41.0, Unit.PCT, 217.0, Unit.PX);
		layoutPanel.setWidgetTopHeight(comprasLabel, 554.0, Unit.PX, 19.0, Unit.PX);
		
		AbsolutePanel comprasAP = new AbsolutePanel();
		comprasAP.setStyleName("panelConBorde");
		layoutPanel.add(comprasAP);
		layoutPanel.setWidgetLeftWidth(comprasAP, 41.0, Unit.PCT, 35.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(comprasAP, 579.0, Unit.PX, 310.0, Unit.PX);
		
		ScrollPanel comprasSP = new ScrollPanel();
		comprasSP.setStyleName("tabla");
		comprasAP.add(comprasSP, -10, -5);
		comprasSP.setSize("415px", "250px");
		
		comprasFT = new FlexTable();
		comprasSP.setWidget(comprasFT);
		comprasFT.setSize("100%", "100%");
		
		// columna medida variable 1
		comprasFT.setText(0, COM_MEDIDA_VARIABLE_1, "MEDIDA VARIABLE 1");
		comprasFT.getCellFormatter().setWidth(0, COM_MEDIDA_VARIABLE_1, "25%");
		
		// columna medida variable 2
		comprasFT.setText(0, COM_MEDIDA_VARIABLE_2, "MEDIDA VARIABLE 2");
		comprasFT.getCellFormatter().setWidth(0, COM_MEDIDA_VARIABLE_2, "25%");
		
		// columna cantidad solicitada
		comprasFT.setText(0, COM_CANTIDAD_SOLICITADA, "CANTIDAD SOLICITADA");
		comprasFT.getCellFormatter().setWidth(0, COM_CANTIDAD_SOLICITADA, "25%");
		
		// columna fecha requerimiento compra
		comprasFT.setText(0, COM_FECHA_REQUERIMIENTO_COMPRA, "FECHA REQUERIMIENTO COMPRA");
		comprasFT.getCellFormatter().setWidth(0, COM_FECHA_REQUERIMIENTO_COMPRA, "25%");
		
		// seteamos el estilo a los encabezados
		comprasFT.getRowFormatter().addStyleName(0, "tablaEncabezado");
		
		Label totalSolicitadoLabel = new Label("TOTAL SOLICITADO: ");
		totalSolicitadoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		totalSolicitadoLabel.setStyleName("gwt-LabelFormulario");
		comprasAP.add(totalSolicitadoLabel, 200, 275);
		totalSolicitadoLabel.setSize("123px", "19px");
		
		totalSolicitadoTB = new TextBox();
		comprasAP.add(totalSolicitadoTB, 335, 270);
		totalSolicitadoTB.setSize("80px", "28");
		totalSolicitadoTB.setEnabled(false);
		
		Label provistoLabel = new Label("PROVISTO");
		provistoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(provistoLabel);
		layoutPanel.setWidgetLeftWidth(provistoLabel, 77.0, Unit.PCT, 217.0, Unit.PX);
		layoutPanel.setWidgetTopHeight(provistoLabel, 554.0, Unit.PX, 19.0, Unit.PX);
		
		AbsolutePanel provistoAP = new AbsolutePanel();
		provistoAP.setStyleName("panelConBorde");
		layoutPanel.add(provistoAP);
		layoutPanel.setWidgetLeftWidth(provistoAP, 77.0, Unit.PCT, 18.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(provistoAP, 579.0, Unit.PX, 50.0, Unit.PX);
		
		Label totalProvistoLabel = new Label("TOTAL PROVISTO: ");
		totalProvistoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		totalProvistoLabel.setStyleName("gwt-LabelFormulario");
		provistoAP.add(totalProvistoLabel, -10, 15);
		totalProvistoLabel.setSize("118px", "19px");
		
		totalProvistoTB = new TextBox();
		provistoAP.add(totalProvistoTB, 125, 10);
		totalProvistoTB.setSize("80px", "28");
		totalProvistoTB.setEnabled(false);
		
		Label totalesLabel = new Label("TOTALES");
		totalesLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(totalesLabel);
		layoutPanel.setWidgetLeftWidth(totalesLabel, 77.0, Unit.PCT, 217.0, Unit.PX);
		layoutPanel.setWidgetTopHeight(totalesLabel, 778.0, Unit.PX, 19.0, Unit.PX);
		
		AbsolutePanel totalesAP = new AbsolutePanel();
		totalesAP.setStyleName("panelConBorde");
		layoutPanel.add(totalesAP);
		layoutPanel.setWidgetLeftWidth(totalesAP, 77.0, Unit.PCT, 18.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(totalesAP, 803.0, Unit.PX, 86.0, Unit.PX);
		
		Label totalRSPLabel = new Label("TOTAL R + S + P:");
		totalRSPLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		totalRSPLabel.setStyleName("gwt-LabelFormulario");
		totalesAP.add(totalRSPLabel, -10, 15);
		totalRSPLabel.setSize("118px", "19px");
		
		totalRCPTB = new TextBox();
		totalesAP.add(totalRCPTB, 125, 10);
		totalRCPTB.setSize("80px", "28");
		totalRCPTB.setEnabled(false);
		
		Label totalRequeridoLabel = new Label("REQ. BRUTO: ");
		totalRequeridoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		totalRequeridoLabel.setStyleName("gwt-LabelFormulario");
		totalesAP.add(totalRequeridoLabel, -20, 50);
		totalRequeridoLabel.setSize("128px", "19px");
		
		totalRequeridoTB = new TextBox();
		totalesAP.add(totalRequeridoTB, 125, 45);
		totalRequeridoTB.setSize("80px", "28");
		totalRequeridoTB.setEnabled(false);
		
		descartarCambiosBtn = new Button("DESCARTAR CAMBIOS");
		layoutPanel.add(descartarCambiosBtn);
		layoutPanel.setWidgetLeftWidth(descartarCambiosBtn, 66.2, Unit.PCT, 179.0, Unit.PX);
		layoutPanel.setWidgetTopHeight(descartarCambiosBtn, 910.0, Unit.PX, 28.0, Unit.PX);
		
		descartarCambiosBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				limpiarSegundaSeccion();
			}
		});
		
		confirmarCambiosBtn = new Button("CONFIRMAR CAMBIOS");
		layoutPanel.add(confirmarCambiosBtn);
		layoutPanel.setWidgetLeftWidth(confirmarCambiosBtn, 81.4, Unit.PCT, 165.0, Unit.PX);
		layoutPanel.setWidgetTopHeight(confirmarCambiosBtn, 910.0, Unit.PX, 28.0, Unit.PX);
		
		confirmarCambiosBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
				confirmarCambiosBtn.setEnabled(false);
				
				Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
					public void execute() {
						if(!errorReserva) {
							if(cargarCambiosEnListaRequerimientos())
								confirmarCambios();
						}
						
						errorReserva = false;
					}
				});
			}
		});

		confirmarCambiosBtn.setEnabled(false);
		descartarCambiosBtn.setEnabled(false);
		
		//Sección pie.
		
		Label pieLabel = new Label("");
		pieLabel.setStyleName("labelTitulo");
		layoutPanel.add(pieLabel);
		layoutPanel.setWidgetLeftWidth(pieLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(pieLabel, 940.0, Unit.PX, 50.0, Unit.PX);
		
		Button salirBtn = new Button("CANCELAR");
		layoutPanel.add(salirBtn);
		layoutPanel.setWidgetRightWidth(salirBtn, 5.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(salirBtn, 15.0, Unit.PX, 28.0, Unit.PX);
		
		salirBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				cancelar(event);
			}
		});
		
		cargarRequerimientosMateriales();
	}
	
	/**
	 * Método que carga la tabla de requerimiento de materiales
	 * @param ordenFabricacion
	 */
	private void cargarRequerimientosMateriales() {
		
		// Se calculan los requerimientos de materiales de la orden de fabricación pasada como parámetro.
		// En caso de que los requerimientos hayan cambiado desde la última vez que se entró, el método los actualiza.
		produccionService.actualizarRequerimientoMateriales(ordenFabricacion, new AsyncCallback<List<RequerimientoMaterialDTO>>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}

			@Override
			public void onSuccess(List<RequerimientoMaterialDTO> listaRequerimientoMateriales) {

				listaRequerimientoMaterialesDTO = listaRequerimientoMateriales;
				
				filaAIngresar = 1;
				
				cargarTablaPrimeraSeccion(listaRequerimientoMaterialesDTO);
			}
		});
	}
	
	
	/**
	 * Método que se encarga de cargar la tabla de la primera sección para un requerimiento con todos sus detalles.
	 * @param requerimiento
	 */
	private void cargarTablaPrimeraSeccion(List<RequerimientoMaterialDTO> requerimiento) {
		
		produccionService.calcularRequerimientosActuales(requerimiento, new AsyncCallback<List<RequerimientoMaterialDTO>>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}

			@Override
			public void onSuccess(List<RequerimientoMaterialDTO> requerimientos) {
				
				for(RequerimientoMaterialDTO requerimiento : requerimientos) {
					RadioButton radioButton = new RadioButton("seleccion");						
					requerimientoMaterialesFT.setWidget(filaAIngresar, RM_CHECK, radioButton);
					requerimientoMaterialesFT.getFlexCellFormatter().setHorizontalAlignment(filaAIngresar, RM_CHECK, HasHorizontalAlignment.ALIGN_CENTER);	
					
					radioButton.addClickHandler(new ClickHandler() {
						public void onClick(ClickEvent event) {
							
							//Cargar segunda parte de la pantalla.
							limpiarSegundaSeccion();
							
							int filaSeleccionada = requerimientoMaterialesFT.getCellForEvent(event).getRowIndex();
							requerimientoSeleccionadoLista = requerimientoMaterialesFT.getCellForEvent(event).getRowIndex();
							
							//Comprobación para obtener el índice del requerimiento que se seleccionó de la lista de requerimientos.
							for(int j = requerimientoMaterialesFT.getCellForEvent(event).getRowIndex(); j > 1; j--) {
								if(requerimientoMaterialesFT.getText(j-1, RM_ELEMENTO).equals("")) {
									requerimientoSeleccionadoLista--;
								}
							}
							requerimientoSeleccionadoLista--;
							
							//Carga de campos.							
							fechaPrevistaInicioTB.setText(requerimientoMaterialesFT.getText(filaSeleccionada, RM_FECHA_PREVISTA_INICIO));
							elementoTB.setText(requerimientoMaterialesFT.getText(filaSeleccionada, RM_ELEMENTO));
							materialTB.setText(requerimientoMaterialesFT.getText(filaSeleccionada, RM_MATERIAL));
							medidaFijaTB.setText(requerimientoMaterialesFT.getText(filaSeleccionada, RM_MEDIDA_FIJA));
							
							confirmarCambiosBtn.setEnabled(true);
							descartarCambiosBtn.setEnabled(true);
							
							//Carga de tablas de la segunda sección.
							cargarTablasSegundaSeccion();
						}
					});
					
					requerimientoMaterialesFT.setWidget(filaAIngresar, RM_ELEMENTO, new Label(requerimiento.getProducto().getElemento().getNombre()));
					requerimientoMaterialesFT.getCellFormatter().setWordWrap(filaAIngresar, RM_ELEMENTO, true);
					requerimientoMaterialesFT.setWidget(filaAIngresar, RM_MATERIAL, new Label(requerimiento.getProducto().getMaterial().getNombre()));
					requerimientoMaterialesFT.getCellFormatter().setWordWrap(filaAIngresar, RM_MATERIAL, true);
					requerimientoMaterialesFT.setWidget(filaAIngresar, RM_MEDIDA_FIJA, new Label(requerimiento.getProducto().getMedidaFija().getMedida()));
					requerimientoMaterialesFT.getCellFormatter().setWordWrap(filaAIngresar, RM_MEDIDA_FIJA, true);
					requerimientoMaterialesFT.setWidget(filaAIngresar, RM_REQUERIMIENTO_BRUTO, new Label(String.valueOf(requerimiento.getRequerimientoBruto())));
					requerimientoMaterialesFT.getCellFormatter().setWordWrap(filaAIngresar, RM_REQUERIMIENTO_BRUTO, true);
					if(requerimiento.getRequerimientoBruto() - requerimiento.getTotalRSP() < 0)
						requerimientoMaterialesFT.setWidget(filaAIngresar, RM_REQUERIMIENTO_NETO, new Label("0.0"));
					else
						requerimientoMaterialesFT.setWidget(filaAIngresar, RM_REQUERIMIENTO_NETO, new Label(String.valueOf(requerimiento.getRequerimientoBruto() - requerimiento.getTotalRSP())));
					requerimientoMaterialesFT.getCellFormatter().setWordWrap(filaAIngresar, RM_REQUERIMIENTO_NETO, true);
					requerimientoMaterialesFT.setWidget(filaAIngresar, RM_FECHA_PREVISTA_INICIO, new Label(String.valueOf(formatoFecha.format(requerimiento.getFechaEstimadaInicio()))));
					requerimientoMaterialesFT.getCellFormatter().setWordWrap(filaAIngresar, RM_FECHA_PREVISTA_INICIO, true);
					
					//Creamos el Label para expandir y le seteamos su clickHandler.
					Label expandirLb = new Label("");
					expandirLb.setSize("12px", "12px");
					expandirLb.setStyleName("labelExpandirMas");
					
					expandirLb.addClickHandler(new ClickHandler() {
						public void onClick(ClickEvent event) {
							
							int aExpandir = requerimientoMaterialesFT.getCellForEvent(event).getRowIndex() + 1;
							
							//Si las filas interiores no se están mostrando...
							if(!requerimientoMaterialesFT.getRowFormatter().isVisible(aExpandir)) {
								
								requerimientoMaterialesFT.getWidget(aExpandir - 1, RM_EXPANDIR).setStyleName("labelExpandirMenos");
								
								while(aExpandir < requerimientoMaterialesFT.getRowCount() && !requerimientoMaterialesFT.getRowFormatter().isVisible(aExpandir)) {
									requerimientoMaterialesFT.getRowFormatter().setVisible(aExpandir, true);
									aExpandir++;
								}
							}
							
							//Si las filas interiores se están mostrando...
							else {
								
								requerimientoMaterialesFT.getWidget(aExpandir - 1, RM_EXPANDIR).setStyleName("labelExpandirMas");
								
								while(aExpandir < requerimientoMaterialesFT.getRowCount() && requerimientoMaterialesFT.getText(aExpandir, RM_ELEMENTO).equals("")) {
									requerimientoMaterialesFT.getRowFormatter().setVisible(aExpandir, false);
									aExpandir++;
								}
							}
						}
					});
					
					requerimientoMaterialesFT.setWidget(filaAIngresar, RM_EXPANDIR, expandirLb);
					requerimientoMaterialesFT.getFlexCellFormatter().setHorizontalAlignment(filaAIngresar, RM_EXPANDIR, HasHorizontalAlignment.ALIGN_CENTER);
					requerimientoMaterialesFT.getRowFormatter().setStyleName(filaAIngresar, "tablaRenglon");
					
					filaAIngresar++;
					
					for(int j = 0; j < requerimiento.getListaMaterialesRequeridos().size(); j++) {
						
						requerimientoMaterialesFT.setWidget(filaAIngresar, RM_MEDIDA_VARIABLE_1, new Label(String.valueOf(requerimiento.getListaMaterialesRequeridos().get(j).getMedidaVariable1())));
						requerimientoMaterialesFT.getCellFormatter().setWordWrap(filaAIngresar, RM_MEDIDA_VARIABLE_1, true);
						requerimientoMaterialesFT.setWidget(filaAIngresar, RM_MEDIDA_VARIABLE_2, new Label(String.valueOf(requerimiento.getListaMaterialesRequeridos().get(j).getMedidaVariable2())));
						requerimientoMaterialesFT.getCellFormatter().setWordWrap(filaAIngresar, RM_MEDIDA_VARIABLE_2, true);
						requerimientoMaterialesFT.setWidget(filaAIngresar, RM_CANTIDAD, new Label(String.valueOf(requerimiento.getListaMaterialesRequeridos().get(j).getCantidad())));
						requerimientoMaterialesFT.getCellFormatter().setWordWrap(filaAIngresar, RM_CANTIDAD, true);
						
						if((String.valueOf(requerimiento.getListaMaterialesRequeridos().get(j).getMedidaVariable1()).equals("0.0"))&&(String.valueOf(requerimiento.getListaMaterialesRequeridos().get(j).getMedidaVariable1()).equals("0.0")))
							requerimientoMaterialesFT.setWidget(filaAIngresar, RM_REQUERIMIENTO_BRUTO, new Label(String.valueOf(requerimiento.getListaMaterialesRequeridos().get(j).getCantidad()) + ".0"));
						else if(String.valueOf(requerimiento.getListaMaterialesRequeridos().get(j).getMedidaVariable2()).equals("0.0"))
							requerimientoMaterialesFT.setWidget(filaAIngresar, RM_REQUERIMIENTO_BRUTO, new Label(String.valueOf(requerimiento.getListaMaterialesRequeridos().get(j).getCantidad() * requerimiento.getListaMaterialesRequeridos().get(j).getMedidaVariable1())));
						else
							requerimientoMaterialesFT.setWidget(filaAIngresar, RM_REQUERIMIENTO_BRUTO, new Label(String.valueOf(requerimiento.getListaMaterialesRequeridos().get(j).getCantidad() * requerimiento.getListaMaterialesRequeridos().get(j).getMedidaVariable1() * requerimiento.getListaMaterialesRequeridos().get(j).getMedidaVariable2())));						
						requerimientoMaterialesFT.getCellFormatter().setWordWrap(filaAIngresar, RM_REQUERIMIENTO_BRUTO, true);
						
						requerimientoMaterialesFT.setWidget(filaAIngresar, RM_REQUERIMIENTO_NETO, new Label(""));
						requerimientoMaterialesFT.getCellFormatter().setWordWrap(filaAIngresar, RM_REQUERIMIENTO_NETO, true);
						requerimientoMaterialesFT.setWidget(filaAIngresar, RM_FECHA_PREVISTA_INICIO, new Label(""));
						requerimientoMaterialesFT.getCellFormatter().setWordWrap(filaAIngresar, RM_FECHA_PREVISTA_INICIO, true);
						
						requerimientoMaterialesFT.getRowFormatter().setStyleName(filaAIngresar, "tablaRenglonExpandida");
						
						requerimientoMaterialesFT.getRowFormatter().setVisible(filaAIngresar, false);
					
						filaAIngresar++;
					}				
				}
			}
		});
	}
	
	/**
	 * Método que se encarga de cargar las tablas de la segunda sección.
	 */
	private void cargarTablasSegundaSeccion() {
		
		produccionService.calcularReservasYCompras(listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista), new AsyncCallback<RequerimientoMaterialDTO>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}

			@Override
			public void onSuccess(RequerimientoMaterialDTO requerimiento) {
		
				//Cargamos la tabla de reserva de producto.
				int filaAIngresarReserva = 1;		
				listaRequerimientoMaterialesDTO.set(requerimientoSeleccionadoLista, requerimiento);
				List<ReservaProductoDTO> listaReservaProducto = listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos();
				cantidadReservadaLL.clear();
				
				for (int i = 0; i < listaReservaProducto.size(); i++) {
										
					final TextBox cantidadReservada = new TextBox();			
					cantidadReservada.setSize("85%", "85%");
					cantidadReservada.setMaxLength(3);
					cantidadReservada.setText(String.valueOf(listaReservaProducto.get(i).getCantidadReservada().intValue()));
					
					cantidadReservadaLL.add(cantidadReservada);
					
					reservasFT.setWidget(filaAIngresarReserva, RES_MEDIDA_VARIABLE_1, new Label(String.valueOf(Double.valueOf(listaReservaProducto.get(i).getInventario().getMedida1()))));
					reservasFT.getCellFormatter().setWordWrap(filaAIngresarReserva, RES_MEDIDA_VARIABLE_1, true);
					reservasFT.setWidget(filaAIngresarReserva, RES_MEDIDA_VARIABLE_2, new Label(String.valueOf(Double.valueOf(listaReservaProducto.get(i).getInventario().getMedida2()))));
					reservasFT.getCellFormatter().setWordWrap(filaAIngresarReserva, RES_MEDIDA_VARIABLE_2, true);
					reservasFT.setWidget(filaAIngresarReserva, RES_CANTIDAD_PENDIENTE_ENTREGA, new Label(String.valueOf(listaReservaProducto.get(i).getCantidadReservadaPendienteEntrega().intValue())));
					reservasFT.getCellFormatter().setWordWrap(filaAIngresarReserva, RES_CANTIDAD_PENDIENTE_ENTREGA, true);
					reservasFT.setWidget(filaAIngresarReserva, RES_CANTIDAD_DISPONIBLE, new Label(String.valueOf(listaReservaProducto.get(i).getInventario().getCantidadDisponible().intValue())));
					reservasFT.getCellFormatter().setWordWrap(filaAIngresarReserva, RES_CANTIDAD_DISPONIBLE, true);
					reservasFT.setWidget(filaAIngresarReserva, RES_CANTIDAD_RESERVADA, cantidadReservada);
					reservasFT.getCellFormatter().setWordWrap(filaAIngresarReserva, RES_CANTIDAD_RESERVADA, true);
					
					reservasFT.getRowFormatter().setStyleName(filaAIngresarReserva, "tablaRenglon");
					
					cantidadReservada.setStyleName("textBoxTabla");
					
					cantidadReservada.addFocusHandler(new FocusHandler () {
						public void onFocus(FocusEvent event) {
							errorReserva = false;
						}
					});
					
					cantidadReservada.addChangeHandler(new ChangeHandler() {
						public void onChange(ChangeEvent event) {
							
							int i = 0;							
							
							while (!cantidadReservadaLL.get(i).equals(cantidadReservada)) {
								i++;
							}
							
							//Para obtener la fila que corresponde.
							reservaSeleccionada = i;
							
							validarCamposReservas();
						}
					});
					
					filaAIngresarReserva++;
				}
				
				//Cargamos la tabla de requerimiento de compra.
				int filaAIngresarCompra = 1;
				List<RequerimientoCompraDTO> listaRequerimientoCompra = listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getRequerimientoCompras();
				
				for (int i = 0; i < listaRequerimientoCompra.size(); i++) {
					
					TextBox cantidadSolicitada = new TextBox();			
					cantidadSolicitada.setSize("85%", "85%");
					cantidadSolicitada.setMaxLength(3);
					cantidadSolicitada.setText("0");
					
					DateBox fechaRequerimientoCompra = new DateBox();	
					fechaRequerimientoCompra.setFormat(new DateBox.DefaultFormat(formatoFecha));
					fechaRequerimientoCompra.setSize("85%", "85%");
					fechaRequerimientoCompra.getTextBox().setReadOnly(true);
				
					comprasFT.setWidget(filaAIngresarCompra, COM_MEDIDA_VARIABLE_1, new Label(String.valueOf(listaRequerimientoCompra.get(i).getMedidaVariable1())));
					comprasFT.getCellFormatter().setWordWrap(filaAIngresarCompra, COM_MEDIDA_VARIABLE_1, true);
					comprasFT.setWidget(filaAIngresarCompra, COM_MEDIDA_VARIABLE_2, new Label(String.valueOf(listaRequerimientoCompra.get(i).getMedidaVariable2())));
					comprasFT.getCellFormatter().setWordWrap(filaAIngresarCompra, COM_MEDIDA_VARIABLE_2, true);
					comprasFT.setWidget(filaAIngresarCompra, COM_CANTIDAD_SOLICITADA, cantidadSolicitada);
					comprasFT.getCellFormatter().setWordWrap(filaAIngresarCompra, COM_CANTIDAD_SOLICITADA, true);
					comprasFT.setWidget(filaAIngresarCompra, COM_FECHA_REQUERIMIENTO_COMPRA, fechaRequerimientoCompra);
					comprasFT.getCellFormatter().setWordWrap(filaAIngresarCompra, COM_FECHA_REQUERIMIENTO_COMPRA, true);
					
					comprasFT.getRowFormatter().setStyleName(filaAIngresarCompra, "tablaRenglon");
					
					cantidadSolicitada.setStyleName("textBoxTabla");
					fechaRequerimientoCompra.setStyleName("textBoxTabla");
					
					filaAIngresarCompra++;
				}
				
				totalReservadoTB.setText(String.valueOf(listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getCantidadReservada()));
				
				totalSolicitadoTB.setText(String.valueOf(listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getCantidadSolicitada()));
				
				totalProvistoTB.setText(String.valueOf(listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getCantidadProvista()));
				
				totalRCPTB.setText(String.valueOf(listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getCantidadReservada() + listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getCantidadSolicitada() + listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getCantidadProvista()));
				
				totalRequeridoTB.setText(String.valueOf(listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getRequerimientoBruto()));
			}
		});
	}
	
	
	/**
	 * Método que se encarga de reflejar los cambios aplicados en la estructura que se mantiene en memoria.
	 */
	private boolean cargarCambiosEnListaRequerimientos() {
		
		boolean validacionCampos = validarCamposCompras();
		
		//Si la segunda sección se completó correctamente...
		if (validacionCampos) {

			//Registramos los cambios de la tabla de reservas de producto.
			int cantidadFilasReserva = reservasFT.getRowCount();
			int reservaProducto = 0;
			
			for (int i = 1; i < cantidadFilasReserva; i++) {
				listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaProducto).getInventario().setCantidadDisponible(Double.parseDouble(reservasFT.getText(i, RES_CANTIDAD_DISPONIBLE)) + 
						listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaProducto).getCantidadReservada() - (Double.parseDouble(((TextBox) reservasFT.getWidget(i, RES_CANTIDAD_RESERVADA)).getText())));
				listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaProducto).setCantidadReservada(Double.parseDouble(((TextBox) reservasFT.getWidget(i, RES_CANTIDAD_RESERVADA)).getText()));
				reservaProducto++;
			}
			
			//Registramos los cambios de la tabla de requerimientos de compra.
			int cantidadFilasCompra = comprasFT.getRowCount();
			int requerimientoCompra = 0;
			
			for (int i = 1; i < cantidadFilasCompra; i++) {
				listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getRequerimientoCompras().get(requerimientoCompra).setCantidadRequerida(Integer.parseInt(((TextBox) comprasFT.getWidget(i, COM_CANTIDAD_SOLICITADA)).getText()));
				listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getRequerimientoCompras().get(requerimientoCompra).setFechaRequerimientoCompra(((DateBox) comprasFT.getWidget(i, COM_FECHA_REQUERIMIENTO_COMPRA)).getValue());
				requerimientoCompra++;
			}
		}
		
		return validacionCampos;		
	}
	
	
	/**
	 * Método que confirma los cambios realizados en la segunda parte de la pantalla.
	 */
	private void confirmarCambios() {
		
		produccionService.registrarReservasYCompras(listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista), new AsyncCallback<RequerimientoMaterialDTO>() {
			@Override
			public void onSuccess(RequerimientoMaterialDTO result) {
				Window.alert("Las reservas y compras se registraron correctamente.");
				
				//Una vez guardados todos los valores, simplemente hacemos una limpieza de la segunda sección.
				limpiarSegundaSeccion();
			}
	
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
				confirmarCambiosBtn.setEnabled(true);
			}
		});
	}
	
	/**
	 * Método que se encarga de validar que los campos de reservas de la segunda sección estén correctamente completados.
	 */
	private void validarCamposReservas() {
		
		errorReserva = false;
		
		if(!cantidadReservadaLL.isEmpty()) {
			
			TextBox cantidadReservada = cantidadReservadaLL.get(reservaSeleccionada);
			
			if (!cantidadReservada.getText().equals("")) {
				
				try {
					Integer.parseInt(cantidadReservada.getText());
					
					//CantidadTotal = CantidadReservada + CantidadDisponible.
					int cantidadTotal = listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaSeleccionada).getCantidadReservada().intValue() + listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaSeleccionada).getInventario().getCantidadDisponible().intValue();
					
					if((Integer.parseInt(cantidadReservada.getText()) < 0) || (Integer.parseInt(cantidadReservada.getText()) > cantidadTotal))
						throw new Exception();
					else {
						//Disponible = DisponibleActual + ReservaAnterior - ReservaActual.
						listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaSeleccionada).getInventario().setCantidadDisponible(listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaSeleccionada).getInventario().getCantidadDisponible() + listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaSeleccionada).getCantidadReservada() - Double.valueOf(((TextBox) reservasFT.getWidget(reservaSeleccionada+1, RES_CANTIDAD_RESERVADA)).getText()));
						//Reserva = ReservaActual.
						listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaSeleccionada).setCantidadReservada(Double.valueOf(((TextBox) reservasFT.getWidget(reservaSeleccionada+1, RES_CANTIDAD_RESERVADA)).getText()));
						((Label) reservasFT.getWidget(reservaSeleccionada+1, RES_CANTIDAD_DISPONIBLE)).setText(String.valueOf(listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaSeleccionada).getInventario().getCantidadDisponible().intValue()));
						errorReserva = false;
					}
				}
				
				catch (Exception e) {
					
					//Si hay error en la reserva.
					Window.alert("- La \"Cantidad Reservada\" en la tabla \"Reservas\" sólo puede ser un número entero positivo menor a la cantidad disponible.");	
					//Disponible = DisponibleActual + ReservaAnterior.
					listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaSeleccionada).getInventario().setCantidadDisponible(listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaSeleccionada).getInventario().getCantidadDisponible() + listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaSeleccionada).getCantidadReservada());
					//Reserva = 0.
					listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaSeleccionada).setCantidadReservada(0.0);
					cantidadReservada.setText("0");
					((Label) reservasFT.getWidget(reservaSeleccionada+1, RES_CANTIDAD_DISPONIBLE)).setText(String.valueOf(listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaSeleccionada).getInventario().getCantidadDisponible().intValue()));
					errorReserva = true;
				}
			}
			else {
				//Disponible = DisponibleActual + ReservaAnterior.
				listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaSeleccionada).getInventario().setCantidadDisponible(listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaSeleccionada).getInventario().getCantidadDisponible() + listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaSeleccionada).getCantidadReservada());
				//Reserva = 0.
				listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaSeleccionada).setCantidadReservada(0.0);
				cantidadReservada.setText("0");
				((Label) reservasFT.getWidget(reservaSeleccionada+1, RES_CANTIDAD_DISPONIBLE)).setText(String.valueOf(listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().get(reservaSeleccionada).getInventario().getCantidadDisponible().intValue()));
				errorReserva = false;
			}
		}
	}
	
	/**
	 * Método que se encarga de validar que los campos de compras de la segunda sección estén correctamente completados.
	 */
	private boolean validarCamposCompras() {
		
		List<String> errores = new LinkedList<String>();
		String mensaje = "";
		boolean resultado = true;
		//boolean banderaReserva = false;
		
		/*
		//Comprobamos si existen errores en la cantidad reservada en la tabla de reservas.
		int cantidadFilasReserva = reservasFT.getRowCount();
		
		for (int i = 1; i < cantidadFilasReserva; i++) {
			
			TextBox cantidadReservada = (TextBox) reservasFT.getWidget(i, RES_CANTIDAD_RESERVADA);
			
			if (!cantidadReservada.getText().equals("")) {
				
				try {
					Integer.parseInt(cantidadReservada.getText());
					
					if((Integer.parseInt(cantidadReservada.getText()) < 0) || (Integer.parseInt(cantidadReservada.getText()) > (Integer.parseInt(reservasFT.getText(i, RES_CANTIDAD_DISPONIBLE)))))
						throw new Exception();
				}
			
				catch (Exception e){
					if (!banderaReserva) {
						errores.add("- La \"Cantidad Reservada\" en la tabla \"Reservas\" sólo puede ser un número entero positivo menor a la cantidad disponible. Filas erróneas:");	
						banderaReserva = true;
					}
					
					errores.add("   * Medida variable 1: " + reservasFT.getText(i, RES_MEDIDA_VARIABLE_1) + " - Medida variable 2: " + reservasFT.getText(i, RES_MEDIDA_VARIABLE_2));
				}
			}
		}
		*/
		
		//Comprobamos si existen errores en la cantidad solicitada en la tabla de compras.
		int cantidadFilasCompra = comprasFT.getRowCount();
		boolean banderaCompra = false;
		
		for (int i = 1; i < cantidadFilasCompra; i++) {
			
			if (!((TextBox) comprasFT.getWidget(i, COM_CANTIDAD_SOLICITADA)).getText().equals("")) {
				
				try {
					Integer.parseInt(((TextBox) comprasFT.getWidget(i, COM_CANTIDAD_SOLICITADA)).getText());
					
					if (Integer.parseInt(((TextBox) comprasFT.getWidget(i, COM_CANTIDAD_SOLICITADA)).getText()) < 0)
						throw new Exception();
				}
			
				catch (Exception e){
					
					if (!banderaCompra) {
						errores.add("- La \"Cantidad Solicitada\" en la tabla \"Compras\" sólo puede ser un número entero positivo. Filas erróneas:");	
						banderaCompra = true;
					}
					
					errores.add("   * Medida variable 1: " + comprasFT.getText(i, COM_MEDIDA_VARIABLE_1) + " - Medida variable 2: " + comprasFT.getText(i, COM_MEDIDA_VARIABLE_2));
				}
			}
			else
				((TextBox) comprasFT.getWidget(i, COM_CANTIDAD_SOLICITADA)).setText("0");
		}
		
		//Comprobamos si existen errores en la fecha requerimiento de la tabla compras.
		banderaCompra = false;
		
		for (int i = 1; i < cantidadFilasCompra; i++) {
			
			if ((!((TextBox) comprasFT.getWidget(i, COM_CANTIDAD_SOLICITADA)).getText().equals("")) && (!((TextBox) comprasFT.getWidget(i, COM_CANTIDAD_SOLICITADA)).getText().equals("0"))) {
				
				DateBox fechaRequerimientoDB = (DateBox) comprasFT.getWidget(i, COM_FECHA_REQUERIMIENTO_COMPRA);
				Date fechaRequerimiento = fechaRequerimientoDB.getValue();
				
				Date fechaHoy = new Date();
				String fechaHoyString = DateTimeFormat.getFormat("dd/MM/yyyy").format(fechaHoy);
				fechaHoy = DateTimeFormat.getFormat("dd/MM/yyyy").parse(fechaHoyString);		
				
				if ((fechaRequerimiento == null) || (fechaHoy.compareTo(fechaRequerimiento) > 0)) {
					
					if (!banderaCompra) {
						errores.add("- La \"Fecha Requerimiento Compra\" no puede ser vacía ni menor a la fecha actual. Filas erróneas:");
						banderaCompra = true;
					}
					
					errores.add("   * Medida variable 1: " + comprasFT.getText(i, COM_MEDIDA_VARIABLE_1) + " - Medida variable 2: " + comprasFT.getText(i, COM_MEDIDA_VARIABLE_2));
				}
			}
		}		

		//Si hubo errores, armamos el mensaje de error.
		if(errores.size() > 0){
			resultado = false;
			
			mensaje = mensaje + errores.get(0);
			
			for(int i=1; i<errores.size(); i++)
				mensaje = mensaje + '\n' + '\n' + errores.get(i);
			
			Window.alert(mensaje);
			confirmarCambiosBtn.setEnabled(true);
		}
			
		return resultado;
	}
	
	
	/**
	 * Método que descarta los cambios realizados en la segunda parte de la pantalla y limpiarla.
	 */
	private void limpiarSegundaSeccion() {
		
		confirmarCambiosBtn.setEnabled(false);
		descartarCambiosBtn.setEnabled(false);
		
		listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getReservaProductos().clear();
		listaRequerimientoMaterialesDTO.get(requerimientoSeleccionadoLista).getRequerimientoCompras().clear();
		
		fechaPrevistaInicioTB.setValue("");
		elementoTB.setValue("");
		materialTB.setValue("");
		medidaFijaTB.setValue("");
		
		totalReservadoTB.setValue("");
		totalSolicitadoTB.setValue("");
		totalProvistoTB.setValue("");
		
		totalRCPTB.setValue("");
		totalRequeridoTB.setValue("");
		
		//Limpiamos la tabla de reservas de productos.
		int cantidadFilasReserva = reservasFT.getRowCount();
		
		for (int i = 1; i < cantidadFilasReserva; i++) {
			reservasFT.removeRow(1);
		}
		
		//Limpiamos la tabla de requerimientos de compra.
		int cantidadFilasCompra = comprasFT.getRowCount();
		
		for (int i = 1; i < cantidadFilasCompra; i++) {
			comprasFT.removeRow(1);
		}
	}
	
	/**
	 * Método que vuelve a la pantalla inmediatamente anterior a la presente.
	 * @param event
	 */
	public void cancelar(ClickEvent event) {
					
		int ancho = Window.getClientWidth() - 15;
		int alto = Window.getClientHeight() - 13;
		
		P_ReservarYComprarSeleccion pReservarYComprarSeleccion = new P_ReservarYComprarSeleccion(padre, tituloTab);
		
		this.getParent().removeFromParent();
		ScrollPanel formulario = new ScrollPanel();
		formulario.setTitle(tituloTab);
		formulario.setStyleName("panelFormulario");
		formulario.setSize((ancho - 25) + "px", (alto - 145) + "px");
		formulario.add(pReservarYComprarSeleccion);
		padre.add(formulario, tituloTab, false);
		padre.selectTab(Validaciones.numeroElemento(padre, tituloTab));
		
		padre.setSize((ancho - 5) + "px", (alto - 90) + "px");

		for(int i = 0; i < padre.getWidgetCount(); i++) {
			padre.getWidget(i).setSize((ancho - 20) + "px", (alto - 145) + "px");
		}
	}
}
